/**
 * 
 */
package fr.gfi.agraf.persistence.dao.impl;

import java.util.List;

import javax.persistence.NoResultException;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Repository;

import fr.gfi.agraf.persistence.dao.IUtilisateurDAO;
import fr.gfi.agraf.persistence.entity.Utilisateur;
import fr.gfi.agraf.utils.PropertiesUtils;

/**
 * @author Zakaria
 * 
 */
@Repository
public class UtilisateurDAO extends AbstractGenericDAO<Utilisateur> implements IUtilisateurDAO {

	private static final String HQL_UTILISATEUR_SELECT_BY_ID_LIST = "hql.utilisateur.selectByIdList";
	private static final String ID_LIST = "idList";
	private static final String HQL_UTILISATEUR_SELECT_BY_PROFIL = "hql.utilisateur.selectByProfil";
	private static final String HQL_UTILISATEUR_SELECT_BY_LOGIN = "hql.utilisateur.selectByLogin";
	private static final String HQL_UTILISATEUR_SELECT_ACTIF = "hql.utilisateur.selectActif";
	private static final String HQL_UTILISATEUR_SELECT_ALL_ACTIF = "hql.utilisateur.selectAllActif";
	private static final String HQL_UTILISATEUR_SELECT_ALL_INACTIF = "hql.utilisateur.selectAllInactif";
	private static final String EMAIL = "email";
	private static final String HQL_UTILISATEUR_SELECT_BY_EMAIL = "hql.utilisateur.selectByEmail";
	private static final String ERREUR_EMAIL_NOTEXIST = "erreur.email.notexist";
	private static final String PASSWORD = "password";
	private static final String LOGIN = "login";
	private static final String HQL_UTILISATEUR_SELECT_BY_LOGIN_AND_PASSOWRD = "hql.utilisateur.selectByLoginAndPassowrd";

	/**
	 * Logger
	 */
	private final static Logger LOGGER = Logger.getLogger(UtilisateurDAO.class);

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.persistence.dao.IUtilisateurDAO#getUtilisateurByEmail(java
	 * .lang.String)
	 */
	public Utilisateur getUtilisateurByEmail(final String email) {
		Utilisateur utilisateur = null;
		// Récupere la requete dans le fichier properties
		final String query = PropertiesUtils.getProperty(HQL_UTILISATEUR_SELECT_BY_EMAIL);
		try {
			// Execute la query
			utilisateur = em.createQuery(query, Utilisateur.class).setParameter(EMAIL, email)
					.getSingleResult();
		} catch (final NoResultException e) {
			LOGGER.error(ERREUR_EMAIL_NOTEXIST, e);
		}

		return utilisateur;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.persistence.dao.IUtilisateurDAO#getUtilisateurByIdentification
	 * (java.lang.String, java.lang.String)
	 */
	public Utilisateur getUtilisateurByIdentification(final String login, final String password) {
		Utilisateur utilisateur = null;
		// Récupere la requete dans le fichier properties
		final String query = PropertiesUtils.getProperty(HQL_UTILISATEUR_SELECT_BY_LOGIN_AND_PASSOWRD);
		try {
			// Execute la query
			utilisateur = em.createQuery(query, Utilisateur.class).setParameter(LOGIN, login)
					.setParameter(PASSWORD, password).getSingleResult();
		} catch (final NoResultException e) {
			LOGGER.error(e);
		}

		return utilisateur;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.persistence.dao.IUtilisateurDAO#getAllUtilisateurActif()
	 */
	public List<Utilisateur> getAllUtilisateurActif() {
		List<Utilisateur> utilisateurList = null;
		// Récupere la requete dans le fichier properties
		final String query = PropertiesUtils.getProperty(HQL_UTILISATEUR_SELECT_ALL_ACTIF);
		try {
			// Execute la query
			utilisateurList = em.createQuery(query, Utilisateur.class).getResultList();
		} catch (final NoResultException e) {
			LOGGER.error(e);
		}

		return utilisateurList;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.persistence.dao.IUtilisateurDAO#getAllUtilisateurInactif()
	 */
	public List<Utilisateur> getAllUtilisateurInactif() {
		List<Utilisateur> utilisateurList = null;
		// Récupere la requete dans le fichier properties
		final String query = PropertiesUtils.getProperty(HQL_UTILISATEUR_SELECT_ALL_INACTIF);
		try {
			// Execute la query
			utilisateurList = em.createQuery(query, Utilisateur.class).getResultList();
		} catch (final NoResultException e) {
			LOGGER.error(e);
		}

		return utilisateurList;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.persistence.dao.IUtilisateurDAO#getUtilisateurActifById(
	 * java.lang.Long)
	 */
	public Utilisateur getUtilisateurActifById(final Long id) {
		Utilisateur utilisateur = null;
		// Récupere la requete dans le fichier properties
		final String query = PropertiesUtils.getProperty(HQL_UTILISATEUR_SELECT_ACTIF);
		try {
			// Execute la query
			utilisateur = em.createQuery(query, Utilisateur.class).setParameter("id", id).getSingleResult();
		} catch (final NoResultException e) {
			LOGGER.error(e);
		}
		return utilisateur;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.persistence.dao.IUtilisateurDAO#getUtilisateurByIdentifiant
	 * (java.lang.String)
	 */
	public Utilisateur getUtilisateurByIdentifiant(final String identifiant) {
		Utilisateur utilisateur = null;
		// Récupere la requete dans le fichier properties
		final String query = PropertiesUtils.getProperty(HQL_UTILISATEUR_SELECT_BY_LOGIN);
		try {
			// Execute la query
			utilisateur = em.createQuery(query, Utilisateur.class).setParameter(LOGIN, identifiant)
					.getSingleResult();
		} catch (final NoResultException e) {
			LOGGER.error(e);
		}
		return utilisateur;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.persistence.dao.IUtilisateurDAO#getUtilisateursByProfilId
	 * (java.lang.Long)
	 */
	public List<Utilisateur> getUtilisateursByProfilId(final Long idProfil) {
		List<Utilisateur> utilisateurList = null;
		// Récupere la requete dans le fichier properties
		final String query = PropertiesUtils.getProperty(HQL_UTILISATEUR_SELECT_BY_PROFIL);
		try {
			// Execute la query
			utilisateurList = em.createQuery(query, Utilisateur.class).setParameter("idProfil", idProfil)
					.getResultList();
		} catch (final NoResultException e) {
			LOGGER.error(e);
		}

		return utilisateurList;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.persistence.dao.IUtilisateurDAO#getUtilisateursByIdList(
	 * java.util.List)
	 */
	public List<Utilisateur> getUtilisateursByIdList(final List<Long> ids) {
		List<Utilisateur> utilisateurList = null;
		// Récupere la requete dans le fichier properties
		final String query = PropertiesUtils.getProperty(HQL_UTILISATEUR_SELECT_BY_ID_LIST);
		try {
			// Execute la query
			utilisateurList = em.createQuery(query, Utilisateur.class).setParameter(ID_LIST, ids)
					.getResultList();
		} catch (final NoResultException e) {
			LOGGER.error(e);
		}

		return utilisateurList;
	}

}
